package cn.buddha.jec.model.mapstruct;

import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mappings;

import java.util.List;

/*
 * @Author 友野浩二
 * @Description // MapStruct基础接口：实现vo与实体类之间的相互转换,包含单个对象和集合。
 *
 * SOURCE: 源类，TARGET: 目标类
 **/
public interface TongBasicTransfer<SOURCE, TARGET> {

    /**
     * @return TARGET
     * @Author 友野浩二
     * @Description // 前向方法：将SOURCE转换为TARGET,即将SOURCE(源类)中的属性值赋值给TARGET(目标类)的属性。
     * @Param [var1]
     * <pre>
     *      这个方法用于实现对象属性复制。
     *      @Mappings : 一组映射关系,可以包含多个@Mapping;
     *      @Mapping: 一对映射关系,用来定义属性复制规则, source 指定源对象属性,target指定目标对象属性。
     *      【注意】: 如果SOURCE和TARGET两个对象的属性名相同的且数据类型也是相同的,则是可以省略@Mapping
     *      使用方式：
     *          @Mappings({
     *              @Mapping(source = "SOURCE.属性1", target = "TARGET.属性1"),
     *              @Mapping(source = "SOURCE.属性2", target = "TARGET.属性2")
     *          })
     *      @InheritConfiguration : 指定映射方法.
     * </pre>
     **/
    @Mappings({})
    @InheritConfiguration
    TARGET to(SOURCE var1);

    @InheritConfiguration
    List<TARGET> to(List<SOURCE> var1);

    /**
     * @return SOURCE
     * @Author 友野浩二
     * @Description // 反向：from()方法是to()方法的反向映射方法，将SOURCE转换为TARGET
     * @Param [var1]
     * <pre>
     *      @InheritInverseConfiguration : 指示方法应继承相应反向方法的反向配置。
     *      通俗讲，如果SOURCE和TARGET中有属性名不一样时，当to方法使用了@Mappings或者单个的@Mapping注解时，该方法中相应的属性也会进行相对应的转换。
     * </pre>
     **/
    @InheritInverseConfiguration
    SOURCE from(TARGET var1);

    @InheritInverseConfiguration
    List<SOURCE> from(List<TARGET> var1);

}
